TIME IS IN SECONDS SINCE MIDNIGHT
set.seed(1234)
rowPicker <- sample(c(TRUE, FALSE), nrow(dt), replace = TRUE, prob = c(.5, .5))
train <- dt[rowPicker, ]
test <- dt[!rowPicker, ]
colnames(train) <- toupper(colnames(train))
# lapply(unique(dtMeta$PARK), function(x) {
lapply(unique(dtMeta$PARK), function(x) {
# get rides that are in the same park, date, and time
rides <-
c(colnames(train)[grepl(paste0(c(toupper(dtMeta$RIDENAME[dtMeta$PARK == x]),
paste0("(^", toupper(x), ")|(", toupper(x), "$)")),
collapse = "|"),
colnames(train))],
"MONTH", "DAY", "TIME",
"WDW_TICKET_SEASON", "DAYOFWEEK", "DAYOFYEAR", "WEEKOFYEAR", "MONTHOFYEAR", "YEAR", "SEASON", "HOLIDAYPX", "HOLIDAYM", "HOLIDAYN", "HOLIDAY", "WDWTICKETSEASON", "WDWRACEN", "WDWEVENTN", "WDWEVENT", "WDWRACE", "WDWSEASON", "WDWMAXTEMP", "WDWMINTEMP", "WDWMEANTEMP", "HOLIDAYJ", "INSESSION", "INSESSION_ENROLLMENT", "INSESSION_WDW", "INSESSION_DLR", "INSESSION_SQRT_WDW", "INSESSION_SQRT_DLR", "INSESSION_CALIFORNIA", "INSESSION_DC", "INSESSION_CENTRAL_FL", "INSESSION_DRIVE1_FL", "INSESSION_DRIVE2_FL", "INSESSION_DRIVE_CA", "INSESSION_FLORIDA", "INSESSION_MARDI_GRAS", "INSESSION_MIDWEST", "INSESSION_NY_NJ", "INSESSION_NY_NJ_PA", "INSESSION_NEW_ENGLAND", "INSESSION_NEW_JERSEY", "INSESSION_NOTHWEST", "INSESSION_PLANES", "INSESSION_SOCAL", "INSESSION_SOUTHWEST", "SUNSET_WDW", "PARTYSEASON_WDW", "WDWMINTEMP_MEAN", "WEATHER_WDWHIGH", "WEATHER_WDWLOW", "WEATHER_WDWPRECIP")
# get the actual ride time variables
actuals <- rides[grepl("(SACTMIN)", rides)]
# return decision trees for the actual ride time variables
return(trees <- sapply(actuals, function(y) {
tr <- rpart(as.formula(paste(y, "~ .")), train[, ..rides])
rpart.plot(tr, main = y)
return(tr)
}))
})













[[1]]
DWARFS_TRAIN_SACTMIN PIRATES_OF_CARIBBEAN_SACTMIN SPLASH_MOUNTAIN_SACTMIN
frame data.frame,8 data.frame,8 data.frame,8
where integer,4124 integer,7834 integer,4290
call expression expression expression
terms terms,3 terms,3 terms,3
cptable numeric,30 numeric,40 numeric,25
method "anova" "anova" "anova"
parms NULL NULL NULL
control list,9 list,9 list,9
functions list,2 list,2 list,2
numresp 1 1 1
splits numeric,170 numeric,275 numeric,125
csplit integer,86 integer,270 integer,84
variable.importance numeric,4 numeric,22 numeric,4
y numeric,4124 numeric,7834 numeric,4290
ordered logical,98 logical,98 logical,98
na.action na.rpart,265627 na.rpart,261917 na.rpart,265461
[[2]]
ALIEN_SAUCERS_SACTMIN ROCK_N_ROLLERCOASTER_SACTMIN SLINKY_DOG_SACTMIN
frame data.frame,8 data.frame,8 data.frame,8
where integer,1397 integer,4369 integer,2802
call expression expression expression
terms terms,3 terms,3 terms,3
cptable numeric,45 numeric,30 numeric,35
method "anova" "anova" "anova"
parms NULL NULL NULL
control list,9 list,9 list,9
functions list,2 list,2 list,2
numresp 1 1 1
splits numeric,365 numeric,185 numeric,270
csplit integer,90 integer,264 integer,35
variable.importance numeric,19 numeric,8 numeric,13
y numeric,1397 numeric,4369 numeric,2802
ordered logical,97 logical,97 logical,97
na.action na.rpart,268354 na.rpart,265382 na.rpart,266949
TOY_STORY_MANIA_SACTMIN
frame data.frame,8
where integer,6111
call expression
terms terms,3
cptable numeric,35
method "anova"
parms NULL
control list,9
functions list,2
numresp 1
splits numeric,235
csplit integer,90
variable.importance numeric,10
y numeric,6111
ordered logical,97
na.action na.rpart,263640
[[3]]
[[3]]$DINOSAUR_SACTMIN
n=3433 (266318 observations deleted due to missingness)
node), split, n, deviance, yval
* denotes terminal node
1) root 3433 2698.63300 2.564218
2) DINOSAUR_SPOSTMIN< 3.064439 1780 1081.64200 2.114991
4) DINOSAUR_SPOSTMIN< 2.553265 1072 602.76020 1.884241 *
5) DINOSAUR_SPOSTMIN>=2.553265 708 335.37670 2.464377 *
3) DINOSAUR_SPOSTMIN>=3.064439 1653 870.97010 3.047958
6) CAPACITYLOSTWGT_AK< 1.312816e+07 193 127.65900 2.408204 *
7) CAPACITYLOSTWGT_AK>=1.312816e+07 1460 653.87680 3.132528
14) DINOSAUR_SPOSTMIN< 3.725516 1091 485.09920 2.992278 *
15) DINOSAUR_SPOSTMIN>=3.725516 369 83.86777 3.547198 *
[[3]]$EXPEDITION_EVEREST_SACTMIN
n=5461 (264290 observations deleted due to missingness)
node), split, n, deviance, yval
* denotes terminal node
1) root 5461 4333.7460 2.380406
2) EXPEDITION_EVEREST_SPOSTMIN< 2.519476 1419 776.9939 1.493982
4) EXPEDITION_EVEREST_SPOSTMIN< 1.898249 757 446.4613 1.279994 *
5) EXPEDITION_EVEREST_SPOSTMIN>=1.898249 662 256.2310 1.738678 *
3) EXPEDITION_EVEREST_SPOSTMIN>=2.519476 4042 2050.3470 2.691598
6) EXPEDITION_EVEREST_SPOSTMIN< 3.282834 1960 747.9855 2.445560
12) EXPEDITION_EVEREST_SPOSTMIN< 2.73439 513 179.2926 2.195171 *
13) EXPEDITION_EVEREST_SPOSTMIN>=2.73439 1447 525.1280 2.534330 *
7) EXPEDITION_EVEREST_SPOSTMIN>=3.282834 2082 1072.0180 2.923219
14) TIME>=58650 435 313.8529 2.640406 *
15) TIME< 58650 1647 714.1831 2.997914 *
[[3]]$FLIGHT_OF_PASSAGE_SACTMIN
n=2862 (266889 observations deleted due to missingness)
node), split, n, deviance, yval
* denotes terminal node
1) root 2862 1389.07300 3.909003
2) FLIGHT_OF_PASSAGE_SPOSTMIN< 4.107685 1105 351.44090 3.460887
4) FLIGHT_OF_PASSAGE_SPOSTMIN< 3.65156 264 63.53720 3.050121 *
5) FLIGHT_OF_PASSAGE_SPOSTMIN>=3.65156 841 229.37620 3.589831
10) TIME< 27750 223 90.70096 3.267808 *
11) TIME>=27750 618 107.20600 3.706030 *
3) FLIGHT_OF_PASSAGE_SPOSTMIN>=4.107685 1757 676.18860 4.190828
6) FLIGHT_OF_PASSAGE_SPOSTMIN< 4.532595 768 259.11680 4.059790
12) SEASON=CHRISTMAS,CHRISTMAS PEAK,EASTER,FALL,HALLOWEEN,JULY 4TH,MARDI GRAS,MARTIN LUTHER KING JUNIOR DAY,PRESIDENTS WEEK,SEPTEMBER LOW,SPRING,SUMMER BREAK,THANKSGIVING,WINTER 751 191.64590 4.038610 *
13) SEASON=COLUMBUS DAY,JERSEY WEEK,MEMORIAL DAY 17 52.25164 4.995438 *
7) FLIGHT_OF_PASSAGE_SPOSTMIN>=4.532595 989 393.64370 4.292586
14) AKCLOSETOM< 66600 16 27.32406 3.018882 *
15) AKCLOSETOM>=66600 973 339.93570 4.313530
30) EXPEDITION_EVEREST_SPOSTMIN< 3.613022 789 273.62270 4.235112 *
31) EXPEDITION_EVEREST_SPOSTMIN>=3.613022 184 40.65580 4.649792 *
[[3]]$KILIMANJARO_SAFARIS_SACTMIN
n=4088 (265663 observations deleted due to missingness)
node), split, n, deviance, yval
* denotes terminal node
1) root 4088 3565.97700 2.695710
2) KILIMANJARO_SAFARIS_SPOSTMIN< 2.865108 1335 880.53540 1.948064 *
3) KILIMANJARO_SAFARIS_SPOSTMIN>=2.865108 2753 1577.34400 3.058263
6) KILIMANJARO_SAFARIS_SPOSTMIN< 3.668808 1225 563.39930 2.822646
12) KILIMANJARO_SAFARIS_SPOSTMIN< 3.313731 733 378.17910 2.666737 *
13) KILIMANJARO_SAFARIS_SPOSTMIN>=3.313731 492 140.85780 3.054924 *
7) KILIMANJARO_SAFARIS_SPOSTMIN>=3.668808 1528 891.41760 3.247157
14) WDWSEASON=HALLOWEEN,SEPTEMBER LOW 53 33.03335 2.310051 *
15) WDWSEASON=CHRISTMAS,CHRISTMAS PEAK,COLUMBUS DAY,EASTER,FALL,JERSEY WEEK,JULY 4TH,MARDI GRAS,MARTIN LUTHER KING JUNIOR DAY,MEMORIAL DAY,PRESIDENTS WEEK,SPRING,SUMMER BREAK,THANKSGIVING,WINTER 1475 810.16900 3.280829
30) KILIMANJARO_SAFARIS_SPOSTMIN< 3.955091 1041 547.01730 3.136783 *
31) KILIMANJARO_SAFARIS_SPOSTMIN>=3.955091 434 189.74120 3.626342 *
[[3]]$NAVI_RIVER_SACTMIN
n=2119 (267632 observations deleted due to missingness)
node), split, n, deviance, yval
* denotes terminal node
1) root 2119 1725.19300 3.052040
2) NAVI_RIVER_SPOSTMIN< 3.212072 539 384.73790 2.075067
4) NAVI_RIVER_SPOSTMIN< 2.358371 267 194.40170 1.730480
8) FLIGHT_OF_PASSAGE_SPOSTMIN< 4.190152 137 95.99198 1.476812 *
9) FLIGHT_OF_PASSAGE_SPOSTMIN>=4.190152 130 80.30382 1.997807 *
5) NAVI_RIVER_SPOSTMIN>=2.358371 272 127.51150 2.413321 *
3) NAVI_RIVER_SPOSTMIN>=3.212072 1580 650.48920 3.385324
6) NAVI_RIVER_SPOSTMIN< 3.850563 984 316.45130 3.171377
12) NAVI_RIVER_SPOSTMIN< 3.422194 260 49.79574 2.896525 *
13) NAVI_RIVER_SPOSTMIN>=3.422194 724 239.96070 3.270081
26) TIME>=68400 77 31.38410 2.840470 *
27) TIME< 68400 647 192.67370 3.321209
54) TIME< 33750 224 64.50204 3.056515 *
55) TIME>=33750 423 104.16660 3.461379 *
7) NAVI_RIVER_SPOSTMIN>=3.850563 596 214.63430 3.738552
14) TIME>=69150 62 31.67787 3.151101 *
15) TIME< 69150 534 159.07610 3.806758
30) TIME< 33750 102 33.66374 3.369943 *
31) TIME>=33750 432 101.35490 3.909894 *
[[4]]
SOARIN_SACTMIN SPACESHIP_EARTH_SACTMIN
frame data.frame,8 data.frame,8
where integer,4982 integer,3353
call expression expression
terms terms,3 terms,3
cptable numeric,25 numeric,35
method "anova" "anova"
parms NULL NULL
control list,9 list,9
functions list,2 list,2
numresp 1 1
splits numeric,155 numeric,195
csplit integer,88 integer,246
variable.importance numeric,9 numeric,4
y numeric,4982 numeric,3353
ordered logical,85 logical,85
na.action na.rpart,264769 na.rpart,266398

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCgpgYGB7cn0KbGlicmFyeShkZXdleSkKbGlicmFyeShkYXRhLnRhYmxlKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShzcGFya2x5cikKClN5cy5zZXRlbnYoSkFWQV9IT01FID0gIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy96dWx1LTExLmpkay9Db250ZW50cy9Ib21lIikKYGBgCgpgYGB7cn0KIyBzYyA8LSBzcGFya19jb25uZWN0KG1hc3RlciA9ICJsb2NhbCIpCgojIGlmKGZpbGUuZXhpc3RzKCJzb3VyY2UiKSkgdW5saW5rKCJzb3VyY2UiLCBUUlVFKQojIGlmKGZpbGUuZXhpc3RzKCJzb3VyY2Utb3V0IikpIHVubGluaygic291cmNlLW91dCIsIFRSVUUpCiMgCiMgc3RyZWFtX2dlbmVyYXRlX3Rlc3QoaXRlcmF0aW9ucyA9IDEpCiMgbGlzdC5maWxlcygic291cmNlIikKIyAKIyByZWFkX2ZvbGRlciA8LSBzdHJlYW1fcmVhZF9jc3Yoc2MsICJzb3VyY2UiKQoKIyBzcGFya19kaXNjb25uZWN0KHNjKQpgYGAKCmBgYHtyfQojIGxvYWQgdGhlIHdhaXQgdGltZSBmaWxlcwpmaWxlcyA8LQogIGRhdGEudGFibGUoImZpbGVQYXRoIiA9IGdyZXAoIipcXC5jc3YiLCBsaXN0LmZpbGVzKCJkYXRhLyIpLCB2YWx1ZSA9IFRSVUUpKSAlPiUKICAuWywgInJpZGVOYW1lIiA6PSAgc3ViKCIoXFxfb2xkKT9cXC5jc3YiLCAiIiwgZmlsZVBhdGgpXSAlPiUKICAuWywgcmlkZU5hbWUgOj0gaWZlbHNlKHJpZGVOYW1lID09ICI3X2R3YXJmc190cmFpbiIsICJkd2FyZnNfdHJhaW4iLCByaWRlTmFtZSldCgpyb3VuZF90aW1lID0gZnVuY3Rpb24oeCwgcHJlY2lzaW9uLCBtZXRob2QgPSByb3VuZCkgewogIGlmICgiUE9TSVhjdCIgJWluJSBjbGFzcyh4KSA9PSBGQUxTRSkKICAgIHN0b3AoInggbXVzdCBiZSBQT1NJWGN0IikKICAKICB0eiA9IGF0dHJpYnV0ZXMoeCkkdHpvbmUKICBzZWNzX3JvdW5kZWQgPSBtZXRob2QoYXMubnVtZXJpYyh4KSAvIHByZWNpc2lvbikgKiBwcmVjaXNpb24KICBhcy5QT1NJWGN0KHNlY3Nfcm91bmRlZCwgdHogPSB0eiwgb3JpZ2luID0gIjE5NzAtMDEtMDEiKQp9Cgpsb25nZXJEYXRhIDwtIGZ1bmN0aW9uKHgpIHsKICByYmluZGxpc3QoCiAgICBsaXN0KHggJT4lIAogICAgICAgICAgIC5bLCAuKFJJREVOQU1FLCBkYXRlLCBkYXRldGltZSwgU0FDVE1JTildICU+JSAKICAgICAgICAgICAuWywgYDo9YChUWVBFID0gIlNBQ1RNSU4iLCBXQUlUVElNRSA9IFNBQ1RNSU4sIFNBQ1RNSU4gPSBOVUxMKV0sCiAgICAgICAgIHggJT4lIAogICAgICAgICAgIC5bLCAuKFJJREVOQU1FLCBkYXRlLCBkYXRldGltZSwgU1BPU1RNSU4pXSAlPiUgCiAgICAgICAgICAgLlssIGA6PWAoVFlQRSA9ICJTUE9TVE1JTiIsIFdBSVRUSU1FID0gU1BPU1RNSU4sIFNQT1NUTUlOID0gTlVMTCldKQogICAgKQp9CgpkdCA8LSB1bmlxdWUocmJpbmRsaXN0KGFwcGx5KGZpbGVzLCAxLCBmdW5jdGlvbih4KSB7IAogICAgZnJlYWQocGFzdGUwKCJkYXRhLyIsIHhbImZpbGVQYXRoIl0pKSAlPiUKICAgIC5bIWlzLm5hKFNQT1NUTUlOKSAmIFNQT1NUTUlOID49IDAgfCAhaXMubmEoU0FDVE1JTikgJiBTQUNUTUlOID49IDBdICU+JQogICAgLlssIFJJREVOQU1FIDo9IHhbInJpZGVOYW1lIl1dCiAgfSksIHVzZS5uYW1lcyA9IFRSVUUpKSAlPiUKICBsb25nZXJEYXRhKC4pICU+JQogIC5bLCBgOj1gKERBVEUgPSBhcy5vcmRlcmVkKGFzLkRhdGUoZGF0ZSwgZm9ybWF0ID0gIiVtLyVkLyVZIikpLAogICAgICAgICAgIGRhdGUgPSBOVUxMLAogICAgICAgICAgIERBVEVUSU1FID0gcm91bmRfdGltZShkYXRldGltZSwgNjAqNSwgZmxvb3IpLAogICAgICAgICAgIGRhdGV0aW1lID0gTlVMTCldICU+JQogIC5bLCBgOj1gKE1PTlRIID0gbW9udGgoREFURVRJTUUpLAogICAgICAgICAgIERBWSA9IG1kYXkoREFURVRJTUUpLAogICAgICAgICAgIFRJTUUgPSBhcy5JVGltZShEQVRFVElNRSksCiAgICAgICAgICAgREFURVRJTUUgPSBOVUxMKV0gJT4lCiAgLlssIFdBSVRUSU1FbWVhbiA6PSBtZWFuKGxvZyhXQUlUVElNRSksIG5hLnJtID0gVFJVRSksCiAgICBieSA9IC4oUklERU5BTUUsIFRZUEUsIERBVEUsIE1PTlRILCBEQVksIFRJTUUpXSAlPiUKICAuWywgV0FJVFRJTUUgOj0gTlVMTF0gJT4lCiAgLltvcmRlcihSSURFTkFNRSwgREFURSwgVFlQRSwgVElNRSldICU+JQogIHVuaXF1ZSgpICU+JQogIGRjYXN0KC4sIERBVEUgKyBNT05USCArIERBWSArIFRJTUUgfiBSSURFTkFNRSArIFRZUEUsIAogICAgICAgIHZhbHVlLnZhciA9ICJXQUlUVElNRW1lYW4iKQoKZHRbZHQgPT0gIk5hTiIgfCBkdCA9PSAiLUluZiJdIDwtIE5BCnByaW50KGR0KQpgYGAKCmBgYHtyfQpSSURFTkFNRSA8LSBjKCJkd2FyZnNfdHJhaW4iLCAiYWxpZW5fc2F1Y2VycyIsICJkaW5vc2F1ciIsIAogICAgICAgICAgICAgICAiZXhwZWRpdGlvbl9ldmVyZXN0IiwgImZsaWdodF9vZl9wYXNzYWdlIiwgImtpbGltYW5qYXJvX3NhZmFyaXMiLCAKICAgICAgICAgICAgICAgIm5hdmlfcml2ZXIiLCAicGlyYXRlc19vZl9jYXJpYmJlYW4iLCAicm9ja19uX3JvbGxlcmNvYXN0ZXIiLCAKICAgICAgICAgICAgICAgInNsaW5reV9kb2ciLCAic29hcmluIiwgInNwYWNlc2hpcF9lYXJ0aCIsICJzcGxhc2hfbW91bnRhaW4iLCAKICAgICAgICAgICAgICAgInRveV9zdG9yeV9tYW5pYSIpCk9QRU5EQVRFIDwtIGFzLkRhdGUoYygiMjAxNC8wNS8yOCIsICIyMDE4LzA2LzMwIiwgIjE5OTgvMDQvMjIiLCAiMjAwNi8wNC8wOSIsIAogICAgICAgICAgICAgICAgICAgICAgICIyMDE3LzA1LzI3IiwgIjE5OTgvMDQvMjIiLCAiMjAxNy8wNS8yNyIsICIxOTczLzEyLzE3IiwgCiAgICAgICAgICAgICAgICAgICAgICAgIjE5OTkvMDcvMjkiLCAiMjAxOC8wNi8zMCIsICIyMDA1LzA1LzE1IiwgIjE5ODIvMTAvMDEiLCAKICAgICAgICAgICAgICAgICAgICAgICAiMTk5Mi8wNy8xNyIsICIyMDA4LzA1LzMxIikpClNQTEFTSCA8LSBjKEZBTFNFLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBUUlVFLCBGQUxTRSwgRkFMU0UsIFRSVUUsICBGQUxTRSwgRkFMU0UsCiAgICAgICAgICAgIEZBTFNFLCBGQUxTRSwgVFJVRSwgIEZBTFNFKQpJTkRPT1IgPC0gYyhGQUxTRSwgRkFMU0UsIFRSVUUsICBGQUxTRSwgVFJVRSwgRkFMU0UsIFRSVUUsICBUUlVFLCAgVFJVRSwgIEZBTFNFLAogICAgICAgICAgICBUUlVFLCAgVFJVRSwgIEZBTFNFLCBUUlVFKQpBR0VISUVSQVJDSFkgPC0gYygxMCwgMTMsICA0LCAgOCwgMTEsIDUsIDEyLCAgMSwgIDYsIDE0LCA3LCAgMiwgIDMsICA5KQpEVVJBVElPTiA8LSBjKDMsIDIuNSwgMy41LCA0LCA2LCAyMCwgNSwgNy41LCAxLjUsIDMsIDgsIDE2LCAxOCwgNi41KQpXQUlUUEVSSFVORFJFRCA8LSBjKDUsIDEwLCAzLCA0LCA0LCA0LCA1LCAxLjUsIDIuNSwgNSwgMywgMywgMy41LCA0LjUpClBBUksgPC0gdG91cHBlcihjKCJtayIsICJocyIsICJhayIsICJhayIsICJhayIsICJhayIsICJhayIsICJtayIsICJocyIsICJocyIsICJlcCIsIAogICAgICAgICAgImVwIiwgIm1rIiwgImhzIikpCmR0TWV0YSA8LSBkYXRhLnRhYmxlKFJJREVOQU1FLCBPUEVOREFURSwgQUdFSElFUkFSQ0hZLCBTUExBU0gsIElORE9PUiwgUEFSSywgRFVSQVRJT04sIFdBSVRQRVJIVU5EUkVEKQpgYGAKCiMgKipJIERJRCBBIExPRyBUUkFOU0ZPUk0qKgoKYGBge3Igd2FybmluZz1GQUxTRX0KbGlicmFyeShHR2FsbHkpCgpzdW1tYXJ5KGR0KQoKc2FwcGx5KHVuaXF1ZShkdE1ldGEkUEFSSyksIGZ1bmN0aW9uKHgpIHsKICByaWRlcyA8LSBkdE1ldGEkUklERU5BTUVbZHRNZXRhJFBBUksgPT0geF0KICBjb2xzIDwtICgxOm5jb2woZHQpKVtncmVwbChwYXN0ZTAocmlkZXMsIGNvbGxhcHNlID0gInwiKSwgY29sbmFtZXMoZHQpKV0KICBwcmludChnZ3BhaXJzKGR0WywgLi5jb2xzXSwgdGl0bGUgPSBwYXN0ZSgiQ29ycmVsYXRpb24gcGxvdCBmb3IgcmlkZXMgaW4iLCB4KSwgCiAgICAgICAgICAgICAgICB1cHBlciA9IGxpc3QoY29udGludW91cyA9IHdyYXAoImNvciIsIHNpemUgPSAzKSksCiAgICAgICAgICAgICAgICBwcm9ncmVzcyA9IEZBTFNFKSArCiAgICAgICAgICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSkpCn0pCmBgYAoKIyAqKlRJTUUgSVMgSU4gU0VDT05EUyBTSU5DRSBNSUROSUdIVCoqCgpgYGB7ciwgZWNobyA9IEZBTFNFLCByZXN1bHRzPSdoaWRlJywgZmlnLmtlZXA9J2FsbCd9CmxpYnJhcnkodHJlZSkKbGlicmFyeShjYXJldCkKbGlicmFyeShycGFydC5wbG90KQoKc2V0LnNlZWQoMTIzNCkKcm93UGlja2VyIDwtIHNhbXBsZShjKFRSVUUsIEZBTFNFKSwgbnJvdyhkdCksIHJlcGxhY2UgPSBUUlVFLCBwcm9iID0gYyguNSwgLjUpKQp0cmFpbiA8LSBkdFtyb3dQaWNrZXIsIF0KdGVzdCA8LSBkdFshcm93UGlja2VyLCBdCgpsYXBwbHkodW5pcXVlKGR0TWV0YSRQQVJLKSwgZnVuY3Rpb24oeCkgewogICMgZ2V0IHJpZGVzIHRoYXQgYXJlIGluIHRoZSBzYW1lIHBhcmssIGRhdGUsIGFuZCB0aW1lCiAgcmlkZXMgPC0gYyhjb2xuYW1lcyh0cmFpbilbZ3JlcGwocGFzdGUwKGR0TWV0YSRSSURFTkFNRVtkdE1ldGEkUEFSSyA9PSB4XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlID0gInwiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXModHJhaW4pKV0sCiAgICAgICAgICAgICAiREFURSIsICJUSU1FIikKICAjIGdldCB0aGUgYWN0dWFsIHJpZGUgdGltZSB2YXJpYWJsZXMKICBhY3R1YWxzIDwtIHJpZGVzW2dyZXBsKCIoU0FDVE1JTikiLCByaWRlcyldCiAgIyByZXR1cm4gZGVjaXNpb24gdHJlZXMgZm9yIHRoZSBhY3R1YWwgcmlkZSB0aW1lIHZhcmlhYmxlcwogIHJldHVybih0cmVlcyA8LSBzYXBwbHkoYWN0dWFscywgZnVuY3Rpb24oeSkgewogICAgdHIgPC0gcnBhcnQoYXMuZm9ybXVsYShwYXN0ZSh5LCAifiAuIikpLCB0cmFpblssIC4ucmlkZXNdKQogICAgcnBhcnQucGxvdCh0ciwgbWFpbiA9IHkpCiAgICByZXR1cm4odHIpCiAgICB9KSkKfSkKYGBgCgpgYGB7cn0KIyBtZXRhZGF0YSA8LSB1bmlxdWUocmJpbmRsaXN0KGxpc3QoZnJlYWQoImRhdGEvbWV0YWRhdGEvbWV0YWRhdGEuY3N2IiwgbmEuc3RyaW5ncyA9IGMoIiIpKSwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWFkKCJkYXRhL21ldGFkYXRhL21ldGFkYXRhX29sZC5jc3YiLCBuYS5zdHJpbmdzID0gYygiIikpKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBUUlVFKSkgJT4lCiMgICAuWywgREFURSA6PSBhcy5vcmRlcmVkKGZvcm1hdChhcy5EYXRlKERBVEUsIGZvcm1hdCA9ICIlbS8lZC8leSIpKSldICU+JQojICAgZndyaXRlKCJuZXdNZXRhZGF0YS5jc3YiKQptZXRhZGF0YSA8LSBmcmVhZCgiZGF0YS9tZXRhZGF0YS9uZXdNZXRhZGF0YS5jc3YiLCBuYS5zdHJpbmdzID0gIiIpICU+JQogIC5bLCBEQVRFIDo9IGFzLm9yZGVyZWQoZm9ybWF0KGFzLkRhdGUoREFURSwgZm9ybWF0ID0gIiVtLyVkLyV5IikpKV0KY29sbmFtZXMobWV0YWRhdGEpIDwtIHRvdXBwZXIoY29sbmFtZXMobWV0YWRhdGEpKQoKdG1wIDwtIGdyZXAoIk9QRU58Q0xPU0V8UFJERFRbMS0yXXsxfXxTSFdOVFsxLTJdezF9fEZJUkVUWzEtMl17MX18UFJETlRbMS0yXXsxfXxTVU5TRVQiLCAKICAgICAgICAgICAgY29sbmFtZXMobWV0YWRhdGEpLCB2YWx1ZSA9IFRSVUUpCm1ldGFkYXRhIDwtIG1ldGFkYXRhWyFkdXBsaWNhdGVkKG1ldGFkYXRhJERBVEUpXQptZXRhZGF0YVssICh0bXApIDo9IGxhcHBseSguU0QsIGFzLklUaW1lKSwgLlNEY29scyA9IHRtcF0KaGVhZChtZXRhZGF0YSkKIyB3aGljaChtZXRhZGF0YSRNS0ZJUkVUMSA9PSBtZXRhZGF0YSRNS0ZJUkVUMikKZGF0ZXRpbWUgPC0gZGF0YS50YWJsZSgiREFURSIgPSByZXAobWV0YWRhdGEkREFURSwgZWFjaCA9IDI4OCksIAogICAgICAgICAgICAgICAgICAgICAgICJUSU1FIiA9IGFzLklUaW1lKHJlcChzZXEoMCozNjAwLCAyNCozNjAwLTEsIGJ5ID0gNjAqNSkpKSkKc2hvd3MgPC0gZ3JlcCgiUFJERFRbMS0yXXsxfXxTSFdOVFsxLTJdezF9fEZJUkVUWzEtMl17MX18UFJETlRbMS0yXXsxfSIsIAogICAgICAgICAgICAgIGNvbG5hbWVzKG1ldGFkYXRhKSwgdmFsdWUgPSBUUlVFKQpzaG93VHlwZSA8LSBjKCJQUkREVCIsICJTSFdOVCIsICJGSVJFVCIsICJQUkROVCIpCnRtcCA8LSBsYXBwbHkodG91cHBlcih1bmlxdWUoZHRNZXRhJFBBUkspKSwgZnVuY3Rpb24oeCkgewogIHR5cGUgPC0gZ3JlcChwYXN0ZTAoeCwgc2hvd1R5cGUsIGNvbGxhcHNlID0gInwiKSwgc2hvd3MsIHZhbHVlID0gVFJVRSkKICB0eXBlIDwtIHVuaXF1ZShzdHJfZXh0cmFjdCh0eXBlLCBwYXN0ZTAoc2hvd1R5cGUsIGNvbGxhcHNlID0gInwiKSkpCiAgbGFwcGx5KHR5cGUsIGZ1bmN0aW9uKHkpIHsKICAgIGNvbHMgPC0gYygiREFURSIsIGdyZXAocGFzdGUwKHgsIHkpLCBzaG93cywgdmFsdWUgPSBUUlVFKSkKICAgIHkgPC0gbWVsdChtZXRhZGF0YVssIC4uY29sc10sCiAgICAgICAgIG1lYXN1cmUudmFycyA9IGNvbHNbLTFdLAogICAgICAgICB2YXJpYWJsZS5uYW1lID0gcGFzdGUwKHgsIHkpLAogICAgICAgICB2YWx1ZS5uYW1lID0gcGFzdGUwKHgsIHksICJUSU1FIikpCiAgICB5IDwtIG1lcmdlKGRhdGV0aW1lLCB5LAogICAgICAgICAgYnkueCA9IGMoIkRBVEUiLCAiVElNRSIpLAogICAgICAgICAgYnkueSA9IGMoIkRBVEUiLCBncmVwKCJUSU1FIiwgbmFtZXMoeSksIHZhbHVlID0gVFJVRSkpLAogICAgICAgICAgYWxsLnggPSBUUlVFKQogICAgeSA8LSB5WywgIWMoIkRBVEUiLCAiVElNRSIpXQogICAgcmV0dXJuKHkpCiAgfSkKfSkKdG1wIDwtIHJsaXN0OjpsaXN0LmNiaW5kKHVubGlzdCh0bXAsIHJlY3Vyc2l2ZSA9IEZBTFNFKSkKY29scyA8LSB1bmlxdWUoY29sbmFtZXModG1wKSkKdG1wIDwtIHRtcFssIC4uY29sc10KdG1wIDwtIGNiaW5kKGRhdGV0aW1lLCB0bXApCgpjb2xzIDwtICFncmVwbChwYXN0ZTAoc2hvd3MsIGNvbGxhcHNlID0gInwiKSwgY29sbmFtZXMobWV0YWRhdGEpKQptZXRhZGF0YSA8LSBtZXJnZSh0bXAsIG1ldGFkYXRhWywgLi5jb2xzXSwgYWxsLnggPSBUUlVFLCBieSA9ICJEQVRFIikKCm1ldGFkYXRhW1RJTUUgPj0gYXMuSVRpbWUoIjA2OjAwOjAwIikgfCBUSU1FIDw9IGFzLklUaW1lKCIwMzowMDowMCIpXQoKdG1wIDwtIG1lcmdlKGR0LCBtZXRhZGF0YSwgYnkgPSAiREFURSIsIGFsbC54ID0gVFJVRSkgJT4lCiAgLlssIERBVEUgOj0gYXMub3JkZXJlZChmb3JtYXQoYXMuRGF0ZShEQVRFKSwgZm9ybWF0ID0gIiVtLSVkIikpXQphcy5JVGltZSh1bmlxdWUodW5saXN0KG1ldGFkYXRhWywgLihNS0VNSE9QRU4sIEVQRU1IT1BFTiwgSFNFTUhPUEVOLCBBS0VNSE9QRU4pXSkpKQojIGR0IDwtIHRtcApybSh0bXApCnJtKG1ldGFkYXRhKQpoZWFkKGR0KQpgYGAKCmBgYHtyfQpzZXQuc2VlZCgxMjM0KQpyb3dQaWNrZXIgPC0gc2FtcGxlKGMoVFJVRSwgRkFMU0UpLCBucm93KGR0KSwgcmVwbGFjZSA9IFRSVUUsIHByb2IgPSBjKC41LCAuNSkpCnRyYWluIDwtIGR0W3Jvd1BpY2tlciwgXQp0ZXN0IDwtIGR0WyFyb3dQaWNrZXIsIF0KY29sbmFtZXModHJhaW4pIDwtIHRvdXBwZXIoY29sbmFtZXModHJhaW4pKQojIGxhcHBseSh1bmlxdWUoZHRNZXRhJFBBUkspLCBmdW5jdGlvbih4KSB7CmxhcHBseSh1bmlxdWUoZHRNZXRhJFBBUkspLCBmdW5jdGlvbih4KSB7CiAgIyBnZXQgcmlkZXMgdGhhdCBhcmUgaW4gdGhlIHNhbWUgcGFyaywgZGF0ZSwgYW5kIHRpbWUKICByaWRlcyA8LQogICAgYyhjb2xuYW1lcyh0cmFpbilbZ3JlcGwocGFzdGUwKGModG91cHBlcihkdE1ldGEkUklERU5BTUVbZHRNZXRhJFBBUksgPT0geF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCIoXiIsIHRvdXBwZXIoeCksICIpfCgiLCB0b3VwcGVyKHgpLCAiJCkiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2UgPSAifCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZXModHJhaW4pKV0sCiAgICAgICJEQVRFIiwgIk1PTlRIIiwgIkRBWSIsICJUSU1FIiwKICAgICAgIldEV19USUNLRVRfU0VBU09OIiwgIkRBWU9GV0VFSyIsICJEQVlPRllFQVIiLCAiV0VFS09GWUVBUiIsICJNT05USE9GWUVBUiIsICJZRUFSIiwgIlNFQVNPTiIsICJIT0xJREFZUFgiLCAiSE9MSURBWU0iLCAiSE9MSURBWU4iLCAiSE9MSURBWSIsICJXRFdUSUNLRVRTRUFTT04iLCAiV0RXUkFDRU4iLCAiV0RXRVZFTlROIiwgIldEV0VWRU5UIiwgIldEV1JBQ0UiLCAiV0RXU0VBU09OIiwgIldEV01BWFRFTVAiLCAiV0RXTUlOVEVNUCIsICJXRFdNRUFOVEVNUCIsICJIT0xJREFZSiIsICJJTlNFU1NJT04iLCAiSU5TRVNTSU9OX0VOUk9MTE1FTlQiLCAiSU5TRVNTSU9OX1dEVyIsICJJTlNFU1NJT05fRExSIiwgIklOU0VTU0lPTl9TUVJUX1dEVyIsICJJTlNFU1NJT05fU1FSVF9ETFIiLCAiSU5TRVNTSU9OX0NBTElGT1JOSUEiLCAiSU5TRVNTSU9OX0RDIiwgIklOU0VTU0lPTl9DRU5UUkFMX0ZMIiwgIklOU0VTU0lPTl9EUklWRTFfRkwiLCAiSU5TRVNTSU9OX0RSSVZFMl9GTCIsICJJTlNFU1NJT05fRFJJVkVfQ0EiLCAiSU5TRVNTSU9OX0ZMT1JJREEiLCAiSU5TRVNTSU9OX01BUkRJX0dSQVMiLCAiSU5TRVNTSU9OX01JRFdFU1QiLCAiSU5TRVNTSU9OX05ZX05KIiwgIklOU0VTU0lPTl9OWV9OSl9QQSIsICJJTlNFU1NJT05fTkVXX0VOR0xBTkQiLCAiSU5TRVNTSU9OX05FV19KRVJTRVkiLCAiSU5TRVNTSU9OX05PVEhXRVNUIiwgIklOU0VTU0lPTl9QTEFORVMiLCAiSU5TRVNTSU9OX1NPQ0FMIiwgIklOU0VTU0lPTl9TT1VUSFdFU1QiLCAiU1VOU0VUX1dEVyIsICJQQVJUWVNFQVNPTl9XRFciLCAiV0RXTUlOVEVNUF9NRUFOIiwgIldFQVRIRVJfV0RXSElHSCIsICJXRUFUSEVSX1dEV0xPVyIsICJXRUFUSEVSX1dEV1BSRUNJUCIpCiAgIyBnZXQgdGhlIGFjdHVhbCByaWRlIHRpbWUgdmFyaWFibGVzCiAgYWN0dWFscyA8LSByaWRlc1tncmVwbCgiKFNBQ1RNSU4pIiwgcmlkZXMpXQogICMgcmV0dXJuIGRlY2lzaW9uIHRyZWVzIGZvciB0aGUgYWN0dWFsIHJpZGUgdGltZSB2YXJpYWJsZXMKICByZXR1cm4odHJlZXMgPC0gc2FwcGx5KGFjdHVhbHMsIGZ1bmN0aW9uKHkpIHsKICAgIHRyIDwtIHJwYXJ0KGFzLmZvcm11bGEocGFzdGUoeSwgIn4gLiIpKSwgdHJhaW5bLCAuLnJpZGVzXSkKICAgIHJwYXJ0LnBsb3QodHIsIG1haW4gPSB5KQogICAgcmV0dXJuKHRyKQogICAgfSkpCn0pCmBgYAoK